import { ecs } from "../../../../core/ecs/ECS";

/**
 * 渲染组件
 * 
 * 关于内存连续性的最佳实践：
 * 
 * 1. reset() 方法不会打断内存连续性
 *    - reset() 只是重置组件数据，不会改变对象在内存中的位置
 *    - 对象池复用的组件始终是同一个对象引用
 * 
 * 2. 真正影响内存连续性的因素：
 *    - 对象的创建顺序（堆分配）
 *    - JavaScript 对象的散列存储特性
 *    - V8 引擎的对象布局优化
 * 
 * 3. 优化建议：
 *    - 使用固定的数据结构（避免动态添加属性）
 *    - 预分配对象池
 *    - 使用 TypedArray 存储大量同类数据
 */

@ecs.register('RenderComponent')
export class RenderComponent extends ecs.Comp {
    // 固定属性 - 有利于 V8 的 Hidden Class 优化
    public visible: boolean = true;
    public zIndex: number = 0;
    public alpha: number = 1.0;
    public spritePath: string = "";
    
    // 避免动态添加属性，所有属性在构造时就定义好
    public color: { r: number; g: number; b: number } = { r: 255, g: 255, b: 255 };
    
    /**
     * reset() 方法的正确实现
     * 
     * 重点：
     * 1. 只重置数据值，不改变对象结构
     * 2. 不要删除属性（delete this.xxx）- 这会改变对象的 Hidden Class
     * 3. 不要动态添加新属性
     */
    reset(): void {
        this.visible = true;
        this.zIndex = 0;
        this.alpha = 1.0;
        this.spritePath = "";
        this.color.r = 255;
        this.color.g = 255;
        this.color.b = 255;
    }
    
    /**
     * 可选：提供初始化方法
     */
    init(spritePath: string, zIndex: number = 0): this {
        this.spritePath = spritePath;
        this.zIndex = zIndex;
        return this;
    }
}
